#!/usr/bin/env python
# coding: utf-8

# # 利用k-均值算法对种子数据聚类

# ## 数据集包含7个特征值和1个分类标签

# In[1]:


# 步骤1：读取数据
import pandas as pd
filename = 'data/seeds_dataset.txt'
data = pd.read_csv(filename, sep='\t', header = None)
# 面积（area, A）、周长（perimeter, P）、紧密度（compactness, C）、
# 内核长度（length of kernel, LK）、内核宽度（width of kernel, WK）、
# 不对称系数（asymmetry coefficient, AC）、
# 核槽长度（length of kernel groove, LKG）、实际种类标签（class）
data.columns = ['A', 'P', 'C', 'LK', 'WK', 'AC', 'LKG', 'class']
print(data.sample(n=5,  random_state=10))  # 随机抽取5行数据


# In[2]:


# 步骤2：绘制散点图矩阵，观察特征数据的分布与区分度
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (15, 10)
plt.rcParams.update({'font.size': 15}) 
#plt.rcParams.update({'axes.labelsize' : 15}) # 标签文字大小

#pd.plotting.scatter_matrix(data.iloc[:,:7], diagonal='hist')
# 由于篇幅限制，只展示前4个属性的散点图矩阵
pd.plotting.scatter_matrix(data.iloc[:,:4], diagonal='hist')

plt.show()


# In[3]:


# 步骤3：数据预处理
#获取特征数据
X = data.iloc[:,0:7].values.astype(float)
#使用StandardScaler()类对数据预处理
from sklearn import preprocessing
scaler = preprocessing.StandardScaler()
scaler.fit(X)
X_scaled = scaler.transform(X)


# In[4]:


# 步骤4：用k-means聚类算法训练模型
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3,random_state=1)
kmeans.fit(X_scaled)


# In[5]:


#步骤5：输出聚类结果，绘制散点图
import numpy as np
import matplotlib.pyplot as plt
#print(kmeans.labels_)  # 显示聚类标签
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定中文字体
plt.rcParams['font.size'] = 15
markers=(".","+","x")   
C=("r","g","b")
#pd.plotting.scatter_matrix(data.iloc[:,:7], c=kmeans.labels_,
#                           diagonal='hist',s=150)
# 由于篇幅限制，只显示前3个属性的散点图矩阵
#pd.plotting.scatter_matrix(data.iloc[:,:3], c=kmeans.labels_,
#                           diagonal='hist',s=150)

# 以P和C为横纵坐标为例，绘制各点所属的簇分布
for i in np.unique(kmeans.labels_):
    plt.scatter(data[kmeans.labels_==i].iloc[:,1:2], #第1列P
                data[kmeans.labels_==i].iloc[:,2:3], #第2列C
                c=C[i],marker=markers[i],s=130,label=f"第{i}簇")
plt.legend()
plt.xlabel("P：周长")
plt.ylabel("C：紧密度")
plt.show()


# In[ ]:




